package br.com.dallasmotopecas.eptus.cliente.controller;

import java.sql.Connection;
import java.util.List;

import javax.faces.context.ExternalContext;

import br.com.dallasmotopecas.comum.cliente.vo.ClienteAssociadoVo;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteDadosDetalheVo;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteDadosFinanceiroVo;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteDadosVo;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteVo;
import br.com.dallasmotopecas.eptus.cliente.model.ClienteEptusModel;
import br.com.dallasmotopecas.util.controller.AbstractController;
import br.com.dallasmotopecas.util.data.ManipulacaoData;
import br.com.dallasmotopecas.util.exception.ClasseNaoEncontradaException;
import br.com.dallasmotopecas.util.exception.ConexaoException;
import br.com.dallasmotopecas.util.exception.ListarObjetoException;

public class ClienteEptusController extends AbstractController
{	
	public ClienteEptusController(ExternalContext externalContext) throws ClasseNaoEncontradaException, ConexaoException
	{
		super(externalContext);
	}

	public ClienteEptusController(Connection connection) throws ConexaoException
	{
		super(connection);
	}
	
	public void processarClientesEptus(final List<ClienteVo> listaCliente, final List<ClienteDadosDetalheVo> listaDetalhadoDados, final List<ClienteDadosVo> listaDados, final List<ClienteAssociadoVo> listaClienteAssociado, final List<ClienteDadosFinanceiroVo> listaDadosTitulosVencidos) throws ListarObjetoException
	{
		listarClientes(listaCliente);
		listarClienteAssociado(listaClienteAssociado);
		listarDadosDetalhadoClientes(listaDetalhadoDados, 0);
		listarDadosClientes(listaDados, 0);
		listarDadosClientesTitulosVencidos(listaDadosTitulosVencidos);
	}
	
	private void listarClientes(final List<ClienteVo> listaCliente) throws ListarObjetoException
	{
		ClienteEptusModel clienteEptusModel = null;
		try
		{
			if (listaCliente != null)
			{
				if (!listaCliente.isEmpty())
					listaCliente.clear();
				
				clienteEptusModel = new ClienteEptusModel(getConnection());
				listaCliente.addAll(clienteEptusModel.getListaCliente());
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteEptusModel = null;
		}
	}
	
	private void listarClienteAssociado(final List<ClienteAssociadoVo> listaClienteAssociado) throws ListarObjetoException
	{
		ClienteEptusModel clienteEptusModel = null;
		try
		{
			if (listaClienteAssociado != null)
			{
				if (!listaClienteAssociado.isEmpty())
					listaClienteAssociado.clear();
				
				clienteEptusModel = new ClienteEptusModel(getConnection());
				listaClienteAssociado.addAll(clienteEptusModel.getListaClienteAssociado());
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteEptusModel = null;
		}
	}
	
	private void listarDadosDetalhadoClientes(final List<ClienteDadosDetalheVo> listaDetalhadoDados, int mes) throws ListarObjetoException
	{
		ClienteEptusModel clienteEptusModel = null;
		ClienteDadosDetalheVo clienteDadosDetalheVo = null;
		
		try
		{	
			if (mes <= ManipulacaoData.getMesCorrente())
			{
				clienteDadosDetalheVo = new ClienteDadosDetalheVo();
				clienteDadosDetalheVo.setDataInicial(new java.sql.Date(ManipulacaoData.getPrimeiroDiaMes(mes).getTime()));
				clienteDadosDetalheVo.setDataFinal(new java.sql.Date(ManipulacaoData.getUltimoDiaMes(mes).getTime()));
				
				clienteDadosDetalheVo.setAnoCompetencia(ManipulacaoData.getAnoCorrente());
				clienteDadosDetalheVo.setMesCompetencia(mes + 1);
				
				clienteEptusModel = new ClienteEptusModel(getConnection());
				
				listaDetalhadoDados.addAll(clienteEptusModel.getListaClienteDadosDetalhe(clienteDadosDetalheVo));
				
				listarDadosDetalhadoClientes(listaDetalhadoDados, ++mes);
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteEptusModel = null;
		}
	}
	
	private void listarDadosClientes(final List<ClienteDadosVo> listaDados, int mes) throws ListarObjetoException
	{
		ClienteEptusModel clienteEptusModel = null;
		ClienteDadosVo clienteDadosVo = null;
		java.sql.Date primeiroDiaMes = null, ultimoDiaMes = null;
		int mesBase = 0, anoBase = 0;
		try
		{	
			if (mes <= ManipulacaoData.getMesCorrente())
			{
				mesBase = mes;
				anoBase = ManipulacaoData.getAnoCorrente();
				
				if (mesBase == 0)
				{
					primeiroDiaMes = new java.sql.Date(ManipulacaoData.getPrimeiroDiaMes(mesBase, anoBase).getTime());
					ultimoDiaMes = new java.sql.Date(ManipulacaoData.getUltimoDiaMes(mesBase, anoBase).getTime());
					clienteDadosVo = new ClienteDadosVo();
					clienteDadosVo.setDataInicial(primeiroDiaMes);
					clienteDadosVo.setDataFinal(ultimoDiaMes);
					clienteDadosVo.setAnoCompetencia(anoBase);
					clienteDadosVo.setMesCompetencia(mesBase + 1);
					clienteEptusModel = new ClienteEptusModel(getConnection());
					listaDados.addAll(clienteEptusModel.getListaClienteDados(clienteDadosVo));
					
					primeiroDiaMes = new java.sql.Date(ManipulacaoData.getPrimeiroDiaMes(11, anoBase - 1).getTime());
					ultimoDiaMes = new java.sql.Date(ManipulacaoData.getUltimoDiaMes(11, anoBase - 1).getTime());
					clienteDadosVo = new ClienteDadosVo();
					clienteDadosVo.setDataInicial(primeiroDiaMes);
					clienteDadosVo.setDataFinal(ultimoDiaMes);
					clienteDadosVo.setAnoCompetencia(anoBase - 1);
					clienteDadosVo.setMesCompetencia(12);
					listaDados.addAll(clienteEptusModel.getListaClienteDados(clienteDadosVo));
				}
				else
				{
					primeiroDiaMes = new java.sql.Date(ManipulacaoData.getPrimeiroDiaMes(mesBase, anoBase).getTime());
					ultimoDiaMes = new java.sql.Date(ManipulacaoData.getUltimoDiaMes(mesBase, anoBase).getTime());
					clienteDadosVo = new ClienteDadosVo();
					clienteDadosVo.setDataInicial(primeiroDiaMes);
					clienteDadosVo.setDataFinal(ultimoDiaMes);
					clienteDadosVo.setAnoCompetencia(anoBase);
					clienteDadosVo.setMesCompetencia(mesBase + 1);
					clienteEptusModel = new ClienteEptusModel(getConnection());
					listaDados.addAll(clienteEptusModel.getListaClienteDados(clienteDadosVo));
				}
				listarDadosClientes(listaDados, ++mes);
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteEptusModel = null;
		}
	}
	
	private void listarDadosClientesTitulosVencidos(final List<ClienteDadosFinanceiroVo> listaDadosTitulosVencidos) throws ListarObjetoException
	{
		ClienteEptusModel clienteEptusModel = null;
		try
		{	
			if (listaDadosTitulosVencidos != null)
			{	
				listaDadosTitulosVencidos.clear();
				clienteEptusModel = new ClienteEptusModel(getConnection());
				listaDadosTitulosVencidos.addAll(clienteEptusModel.getListaReceberAtraso());
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteEptusModel = null;
		}
	}
}
